package com.ruoyi.common.utils;

import com.deepoove.poi.XWPFTemplate;
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.util.StringUtils;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * 根据参数填充word模板生成word文档工具
 */
public class WordTemplateUtils {

    /**
     *
     * @param templatePath 模板文件地址
     * @param filePath 生成word文件地址
     * @param map 模板填充参数
     * @return
     */
    public static boolean compileWordTemplate(String templatePath, String filePath,Map<String, Object> map){
        // 在实际项目应用中返回可自行修改， RestResponse<Map<String, String>>
        try {
            // templatePath和filePath不能为空，可自行判空
            /*if(StringUtils.isEmpty(templatePath)){
                log.info("模板文件不能为空！！！");
                return false;
            }
            if(StringUtils.isEmpty(filePath)){
                log.info("生成word文件地址不能为空！！！");
                return false;
            }*/
            if(map == null){
                System.out.println("入参参数不能为空！！！");
                return false;
            }
            File file = new File(filePath);
            // 判断上级目录是否存在，不存在创建目录
            if(!file.getParentFile().exists()){
                file.getParentFile().mkdirs();
            }
            XWPFTemplate.compile(templatePath).render(map).writeToFile(filePath);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("word文档生成失败！！！");
            return false;
        }
    }
    public static void main(String[] args) {
        String identityNo="520433199704150618";
        String substring = identityNo.substring(identityNo.length() - 6);
        System.out.println(substring);
        System.out.println(SecurityUtils.encryptPassword(substring));
        // 模板文件路径
//        String templatePath = "D:\\测试模板.docx";
//        // 生成文件路径
//        String filePath = "D:\\测试生成模板.docx";
//        String pdfPath = "D:\\测试生成模板.pdf";
//        // 组装参数
//        Map<String, Object> map = new HashMap<>();
//        map.put("productName","2024年第二期住房抵押贷款资产支持证券");
//        map.put("busiDate","2024年01月29日");
//        map.put("TransDate","2024年01月29日");
//        map.put("TransAddr","观山湖区华夏银行");
//        map.put("TransAmount","15000");
//        map.put("TransName","黄金置换");
//        map.put("BusinessName","周大福黄金");
//        map.put("CustomerName","张三");
//        map.put("SealURL","https://img0.baidu.com/it/u=3115346808,4224621571&fm=253&fmt=auto&app=120&f=JPEG?w=400&h=400");
//        map.put("adjustDesc","下一计息期间基准利率为2024年12月5年期以上LPR,即7.30%,基本利差为-1.60%,利率为5.70%");
//        map.put("rateCycle","2023/1/26-2024/1/26");
//        map.put("interestBegin","2023-12-26");
//        map.put("interestEnd","2024-01-26");
//        map.put("investAmt","48,787,200.00");
//        map.put("residueAmt","47,464,000.00");
//        map.put("accruedInterest","108,842.10");
//        map.put("principalInterestSum","48,896,042.10");
//        map.put("year","2024");
//        map.put("month","01");
        // 方法调用
//        WordTemplateUtils.compileWordTemplate(templatePath,filePath,map);
//        try {
//            wordToPdf(filePath,pdfPath);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//        pdfFileToImages(pdfPath,"D:\\");
    }


    /**
     * word转pdf
     * @param wordPath
     * @param pdfPath
     * @throws IOException
     */
    public static void wordToPdf(String wordPath, String pdfPath) throws IOException{
        InputStream docxInputStream = null;
        OutputStream outputStream = null;
        try {
            // 原word地址
            docxInputStream = new FileInputStream(wordPath);
            // 转换后pdf生成地址
            outputStream = new FileOutputStream(pdfPath);
            IConverter converter = LocalConverter.builder().build();
            converter.convert(docxInputStream)
                    .as(DocumentType.DOCX)
                    .to(outputStream)
                    .as(DocumentType.PDF).execute();
            // 关闭
            converter.shutDown();
            // 关闭
            outputStream.close();
            // 关闭
            docxInputStream.close();
        } catch (Exception e) {
            System.out.println("[documents4J] word转pdf失败:" + e.toString());
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
            if (docxInputStream != null) {
                docxInputStream.close();
            }
        }
    }

    /**
     * pdf转图片
     * @param filePath
     * @param imgDirPath
     */
    public static String pdfFileToImages(String filePath, String imgDirPath) {
        try {
            File pdfFile = new File(filePath);
            String name = pdfFile.getName();
            String imgName = name.substring(0, name.indexOf("."));

            PDDocument pd = PDDocument.load(pdfFile);

            PDFRenderer pdfRenderer = new PDFRenderer(pd);
            for (int page = 0; page < pd.getNumberOfPages(); ++page) {
                BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
                //将图片数据保存为PNG格式文档
                File file= new File(imgDirPath + "\\" + imgName + "_" + page + ".png");
                if (file.exists() ) {
                    boolean newFile = file.createNewFile();
                }
                ImageIO.write(image, "png", file);
                System.out.println(file.getAbsolutePath());
                return file.getName();
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

